﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
using Badge_Manager.View;
using BadgeManager.Controller;
using BadgeManager.Model;

namespace Badge_Manager.Controlli
{
    public partial class ctrlWizard3 : UserControl
    {
        #region "Proprietà Pubbliche"

        public List<Persona> AlunniInseriti { get; set; }

        #endregion "Proprietà Pubbliche"

        private List<Persona> alunni;
        private List<Persona> alunniInseriti = new List<Persona>();
        private List<Persona> alunniCancellati = new List<Persona>(); // utilizzato solo nella modifica
        private ctrlPersona ctrlPersona = new ctrlPersona();
        private ctrlAttivita ctrlAttivita = new ctrlAttivita(null);
        private DataTable tableAlunni = new DataTable();
        private DataTable tableAlunniInseriti = new DataTable();
        private int postiVuoti;
        private frmWizard papa;

        public ctrlWizard3()
        {
            InitializeComponent();
            alunni = ctrlPersona.SelectAlunniNonImpegnati();
            SettaColonneGridAlunni();
            AggiornaTabellaAlunni();
        }

        public void Inizializza(frmWizard papa)
        {
            this.papa = papa;
            pbCapienzaAula.Maximum = papa.Attivita.Stanza.Capienza;
            pbCapienzaAula.Minimum = 0;
            pbCapienzaAula.Value = 0;
        }

        private void SettaColonneGridAlunni()
        {
            tableAlunni.Columns.Add("Id", typeof(Guid));
            tableAlunni.Columns.Add("Cognome", typeof(string));
            tableAlunni.Columns.Add("Nome", typeof(string));
            tableAlunni.Columns.Add("Corso", typeof(string));

            tableAlunniInseriti.Columns.Add("Id", typeof(Guid));
            tableAlunniInseriti.Columns.Add("Cognome", typeof(string));
            tableAlunniInseriti.Columns.Add("Nome", typeof(string));
        }

        private void AggiornaTabellaAlunni()
        {
            ctrlAttivita ctrlAttività = new ctrlAttivita(null);
            tableAlunni.Rows.Clear();
            foreach (Persona alunno in alunni)
            {
                Attivita attivita = ctrlAttività.GetAttivitaByPersona(alunno);
                tableAlunni.Rows.Add(
                    alunno.Id,
                    alunno.Cognome,
                    alunno.Nome,
                    ctrlAttività.getCorsoByPersona(alunno) == "" ? "Nessuno" : ctrlAttività.getCorsoByPersona(alunno));
            }
            gridAlunni.DataSource = tableAlunni;
            gridAlunni.Columns["Id"].Visible = false;
        }

        private void IncrementaCapienzaAula()
        {
            if (pbCapienzaAula.Value < pbCapienzaAula.Maximum)
                pbCapienzaAula.Value += 1;
        }

        private void DecrementaCapienzaAula()
        {
            if (pbCapienzaAula.Value >= pbCapienzaAula.Minimum)
                pbCapienzaAula.Value -= 1;
        }

        private void cmdAggiungi_Click(object sender, EventArgs e)
        {
            if (gridAlunni.Rows.Count == 0)
            {
                MessageBox.Show("Impossibile aggiungere non ci sono Alunni!", "Attenzione!"
                    , MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (gridAlunniInseriti.Rows.Count >= papa.Attivita.Stanza.Capienza)
            {
                MessageBox.Show("Impossibile aggiungere altri Alunni, capienza Aula raggiunta!", "Attenzione!"
                    , MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (gridAlunni.SelectedRows.Count > 0)
            {
                for (int i = 0; i < gridAlunni.SelectedRows.Count; i++)
                {
                    if (gridAlunni.Columns["id"] != null)
                    {
                        Persona docente = ctrlPersona.SelectObjectPersonaById(
                            (Guid)gridAlunni.SelectedRows[i].Cells["id"].Value);
                        alunniInseriti.Add(docente);
                        foreach (Persona a in alunni) // ricerca e cancellazione
                        {
                            if (a.Id == docente.Id)
                            {
                                alunni.Remove(a);
                                break;
                            }
                        }
                        tableAlunniInseriti.Rows.Add(docente.Id, docente.Nome, docente.Cognome);
                    }
                    postiVuoti--;
                }
                AggiornaTabellaAlunniInseriti();
                AggiornaTabellaAlunni();
                IncrementaCapienzaAula();
            }
        }

        private void AggiornaTabellaAlunniInseriti()
        {
            tableAlunniInseriti.Rows.Clear();
            foreach (Persona alunno in alunniInseriti)
            {
                tableAlunniInseriti.Rows.Add(alunno.Id,
                    alunno.Cognome, alunno.Nome);
            }
            tableAlunniInseriti.DefaultView.Sort = "Cognome";
            gridAlunniInseriti.DataSource = tableAlunniInseriti;
            gridAlunniInseriti.Columns["id"].Visible = false;
        }

        private void cmdRimuovi_Click(object sender, EventArgs e)
        {
            if (gridAlunniInseriti.SelectedRows.Count > 0)
            {
                for (int i = 0; i < gridAlunniInseriti.SelectedRows.Count; i++)
                {
                    if (gridAlunniInseriti.Columns["id"] != null)
                    {
                        Persona alunno = ctrlPersona.SelectObjectPersonaById(
                            (Guid)gridAlunniInseriti.SelectedRows[i].Cells["id"].Value);
                        alunniCancellati.Add(alunno);
                        alunni.Add(alunno);
                        foreach (Persona a in alunniInseriti) // ricerca e cancellazione
                        {
                            if (a.Id == alunno.Id)
                            {
                                alunniInseriti.Remove(a);
                                break;
                            }
                        }
                    }
                    postiVuoti++;
                }

                AggiornaTabellaAlunniInseriti();
                AggiornaTabellaAlunni();
                DecrementaCapienzaAula();
            }
        }

        internal ctrlWizard2.Risultato Memorizza(frmWizard frmWizard)
        {
            if (alunniInseriti != null)
            {
                frmWizard.Attivita.Persone = alunniInseriti;
                return ctrlWizard2.Risultato.BuonFine;
            }
            else
                return ctrlWizard2.Risultato.Errore;
        }
    }
}